#include <stdlib.h>
#include <stdio.h>

#include "TDA_Lista.h"

typedef tDato tEntero;

tEntero crearEntero(int pValor);
void destruirEntero (tEntero pEntero);
int ordenPrecedenciaEntero(tEntero pEnteroA, tEntero pEnteroB);  
int enteroAInt (tEntero pEntero);
tEntero asignarValorAEntero (tEntero pEntero, int pValor);

void imprimirListaEnteros (FILE* pOutStream, tLista pLista);

//==============================================================================

int main (int argc, char argv [])
{

  // Defino una lista.
  tLista lista;
  listaCrear(&lista, destruirEntero);
  
  listaAgregarFinal(lista, crearEntero(1));
  listaAgregarFinal(lista, crearEntero(2));
  listaAgregarFinal(lista, crearEntero(3));
  listaAgregarFinal(lista, crearEntero(4));
  listaAgregarFinal(lista, crearEntero(5));
  
  // La imprimo por salida estandard.
  imprimirListaEnteros (stdout, lista);
  
  // Elimino el valor 5 de la lista.
  tIteradorLista iterador = listaObtenerIterador(lista);
  int encontrado = 0;
  tEntero cur = NULL;
  while (listaIteradorMoverSiguiente(iterador) && !encontrado)
  {
    cur = (tEntero) listaIteradorActual(iterador);
    encontrado = (1 == enteroAInt(cur));
  }
  listaLiberarIterador(iterador);

  if (encontrado) 
    listaRemover(lista, cur);
  
  // Imprimo nuevamente la lista por salida estandard.
  imprimirListaEnteros (stdout, lista);
  
  // Destruyo la lista.
  listaDestruir (lista);
  
  exit (0);
  
} // main

//==============================================================================

void imprimirListaEnteros (FILE* pOutStream, tLista pLista)
{
  if (pOutStream && pLista)
  {
    tIteradorLista iterador = listaObtenerIterador(pLista);
  
    while (listaIteradorMoverSiguiente(iterador))
    {
      tEntero aux = listaIteradorActual(iterador);
      fprintf (pOutStream, "\n%d\n", enteroAInt (aux));
    }
    listaLiberarIterador(iterador);
  }
}

tEntero crearEntero(int pValor){

  tEntero entero = malloc (sizeof (int));
  
  if (entero) 
    *((int*)entero) = pValor;
  
  return entero;
  
}

tEntero asignarValorAEntero (tEntero pEntero, int pValor){
  
  if (pEntero)
    *((int*)pEntero) = pValor;
  
  return pEntero;
}

void destruirEntero (tEntero pEntero){
  
  if (pEntero) free (pEntero);

}

int ordenPrecedenciaEntero(tEntero pEnteroA, tEntero pEnteroB){
  
  int precedencia = 0;
  
  int val = *((int*)pEnteroA) - *((int*)pEnteroB);
  
  if (val> 0)
    precedencia = 1;
  
  else if (val < 0)
    precedencia = -1;
  
  return precedencia;
    
}

int enteroAInt (tEntero pEntero)
{
  if (pEntero)
  {
     return *((int*)pEntero);
  }
}
